package com.kfm.util;

// 存储的元素的时候不需要去考虑扩容的问题
public class List {

    private Object[] arr; // 存储元素的数组

    private int count; // 记录元素在数组中存储的下标

    private int capacity; // 初始容量

    private static final int DEFAULT_CAPACITY = 10;

    public List() {
        this(DEFAULT_CAPACITY);
    }

    public List(int capacity) {
        if (capacity < 0) {
            capacity = DEFAULT_CAPACITY;
        }
        this.capacity = capacity;
        arr = new Object[capacity];
    }

    public void add(Object obj) {
        grow();
        arr[count++] = obj;
    }

    private void grow() {
        if (count == arr.length) {
            Object[] newArr = new Object[capacity * 2];
            System.arraycopy(arr, 0, newArr, 0, arr.length);
            arr = newArr;
        }
    }

    // 删除元素

    /**
     * 根据元素下标删除元素
     *
     * @param index 元素所在的下标
     * @return 如果删除成功返回删除的对象，删除失败返回 null
     */
    public Object remove(int index) {
        if (index < 0 || index >= arr.length) {
            return null;
        }
        Object obj = arr[index];
        System.arraycopy(arr, 0, arr, 0, index);
        System.arraycopy(arr, index + 1, arr, index, arr.length - index - 1);
        count--;  // 记录元素在数组中的下标
        return obj;
    }

    /**
     * 删除指定元素
     *
     * @param obj 要删除的元素
     * @return 如果删除成功返回删除的对象，删除失败返回 null
     */
    public Object remove(Object obj) {
        for (int i = 0; i < count; i++) {
            if (arr[i].equals(obj)) {
                return remove(i);
            }
        }
        return null;
    }

    /**
     * 按照下标查询元素
     *
     * @param index 要查询的下标
     * @return 如果存在返回该对象，不存在返回 null
     */
    public Object get(int index) {
        if (index < 0 || index >= arr.length) {
            return null;
        }
        return arr[index];
    }


    /**
     * 获取当前存储元素的个数
     * @return 当前存储元素的个数
     */
    public int size() {
        return count;
    }


    public String toString() {
        // List[ User{}, User{}, User{}]
        String str = "共有" + count + "个元素，List[ ";
        for (int i = 0; i < count; i++) {
            if (i == count - 1) {
                str += arr[i];
            } else {
                str += arr[i] + ", ";
            }
        }
        str += " ]";
        return str;
    }
}
